﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Persistencia;
using SearchServer.AppManager;

namespace SearchServer.UI
{
    public partial class MantenimientoUsuarios : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Usuario user = (Usuario)Session["Usuario_SIT"];
            UserManager usrMgr = UserManager.GetInstancia();
            if (user != null && Utilidades.Utilidades.ValidarUsuarioSesion(user))
            {
                if (Request.Form["operacion"] != null && Request.Form["operacion"] == "AgregarUsuario")
                {
                    AgregarUsuario(usrMgr);
                }
                if (Request.Form["operacion"] != null && Request.Form["operacion"] == "ModificarUser")
                {
                    string idUsuarioStr = Request.Form["idusuario"];
                    int idUsuario = int.Parse(idUsuarioStr);
                    ModificarUsuario(usrMgr, idUsuario);
                }
                CargarGrillaUsuarios();
                if (!IsPostBack)
                {
                    BarraNavegacion.Text = Utilidades.Utilidades.CargarLinksVentana(user);
                    List<string> rolsName = new List<string>();
                    List<Persistencia.Rol> roles = usrMgr.ObtenerRolesActivos();
                    foreach (Persistencia.Rol r in roles)
                    {
                        rolsName.Add(r.Nombre);
                    }
                    ListBox1.DataSource = rolsName;
                    ListBox1.DataBind();
                    List<string> estados = new List<string>();
                    estados.Add("Activo");
                    estados.Add("Inactivo");
                    RadioButtonList2.DataSource = estados;
                    RadioButtonList2.DataBind();
                    if (Request.Form["hdnOperacion"] != null && Request.Form["hdnOperacion"] == "EliminarUsuario")
                    {
                        if (Request.Form["hdnIdUsuario"] != null)
                        {
                            int idusuario = Convert.ToInt32(Request.Form["hdnIdUsuario"]);
                            try
                            {
                                usrMgr.EliminarUsuario(idusuario);
                                mensajeError.Text = "Se ha eliminado correctamente el usuario seleccionada";
                            }
                            catch (Exception)
                            {
                                mensajeError.Text = "Se ha producido un error al tratar de eliminar el usuario.";
                            }

                        }
                    }
                    if (Request.Form["hdnOperacion"] != null && Request.Form["hdnOperacion"] == "ModificarUsuario")
                    {
                        if (Request.Form["hdnIdUsuario"] != null)
                        {
                            int idusuario = Convert.ToInt32(Request.Form["hdnIdUsuario"]);
                            try
                            {
                                CargarDatosDeUsuario(idusuario);
                            }
                            catch (Exception)
                            {
                                mensajeError.Text = "Se ha producido al cargar los datos del usuario.";
                            }

                        }
                    }
                    else 
                    {
                        btnAgregarUsuario.Text += "<form action='MantenimientoUsuarios.aspx' method='post'>";
                        btnAgregarUsuario.Text += "<input type='hidden' id='operacion' name='operacion' value = 'AgregarUsuario'/ >";
                        btnAgregarUsuario.Text += "<input type='image' src='Imagenes/btnSave.jpg' onsubmit='submit-form();'/>";
                        btnAgregarUsuario.Text += "</form>";
                    }
                }
            }
            else
            {
                Response.Redirect("Login.aspx", false);
            }
        }

        private void CargarGrillaUsuarios()
        {
            UserManager userManager = UserManager.GetInstancia();
            List<Persistencia.Usuario> resultado = userManager.ObtenerUsuarios();
            tablaResultados.Text = "";
            //Cabezal de la tabla
            tablaResultados.Text += "<tr>";
            tablaResultados.Text += "<td class='gridHeader' style='text-align: center;width: 35%'>";
            tablaResultados.Text += "Nombre";
            tablaResultados.Text += "</td>";
            tablaResultados.Text += "<td class='gridHeader' style='text-align: center;width: 35%;'>";
            tablaResultados.Text += "Apellido";
            tablaResultados.Text += "</td>";
            tablaResultados.Text += "<td class='gridHeader' style='text-align: center;width: 10%;'>";
            tablaResultados.Text += "Activo";
            tablaResultados.Text += "</td>";
            tablaResultados.Text += "<td class='gridHeader' style='text-align: center;width: 10%'>";
            tablaResultados.Text += "</td>";
            tablaResultados.Text += "<td class='gridHeader' style='text-align: center;width: 10%'>";
            tablaResultados.Text += "</td>";
            tablaResultados.Text += "</tr>";
            //Fila para cada Distribucion
            int Numero = 0;
            foreach (Persistencia.Usuario usuario in resultado)
            {
                if (Numero % 2 == 0)
                {
                    //PAR
                    tablaResultados.Text += "<tr class='gridItem'>";
                }
                else
                {
                    //IMPAR
                    tablaResultados.Text += "<tr class='gridAlternatingItem'>";
                }
                tablaResultados.Text += "<td style='text-align:left; padding-left:5px;'>";
                tablaResultados.Text += usuario.Nombre;
                tablaResultados.Text += "</td>";
                tablaResultados.Text += "<td>";
                tablaResultados.Text += usuario.Apellido;
                tablaResultados.Text += "</td>";
                if (usuario.Activo == true)
                {
                    tablaResultados.Text += "<td valign='middle'>";
                    tablaResultados.Text += "<img src='Imagenes/check_box.png' style='cursor: pointer; background-color:transparent;' />";
                    tablaResultados.Text += "</td>";
                }
                else
                {
                    tablaResultados.Text += "<td valign='middle'>";
                    tablaResultados.Text += "<img src='Imagenes/uncheck_box.png' style='cursor: pointer; background-color:transparent;' />";
                    tablaResultados.Text += "</td>";
                }
                tablaResultados.Text += "<td valign='middle'>";
                tablaResultados.Text += "<img id='btnModificar_" + usuario.Id + "' src='Imagenes/btnEdit.png' onclick='ModificarUsuario(this)' style='cursor: pointer; background-color:transparent;' title='Modificar' alt='Modificar'/>";
                tablaResultados.Text += "</td>";
                tablaResultados.Text += "<td valign='middle'>";
                tablaResultados.Text += "<img id='btnEliminar_" + usuario.Id + "' src='Imagenes/btnEliminar.png' onclick='EliminarUsuario(this)' style='cursor: pointer; background-color:transparent;' title='Eliminar' alt='Eliminar'/>";
                tablaResultados.Text += "</td>";
                tablaResultados.Text += "</tr>";
                Numero += 1;
            }
        }

        private void AgregarUsuario(UserManager usrMgr) 
        {
            string nombre = TextBox1.Text;
            string apellido = TextBox2.Text;
            string nameUser = TextBox3.Text;
            string pass = TextBox4.Text;
            string email = TextBox5.Text;
            string estado = "";
            Utilidades.RegexUtilities userManager = Utilidades.RegexUtilities.GetInstancia();
            bool emailCorrecto = userManager.IsValidEmail(email);
            List<string> roles = new List<string>();
            if (ListBox1.SelectedIndex > -1)
            {
                foreach (ListItem item in ListBox1.Items)
                {
                    if (item.Selected)
                    {
                        roles.Add(item.Text);
                    }
                }
            }
            if (RadioButtonList2.SelectedIndex > -1)
            {
                estado = RadioButtonList2.SelectedItem.Text;
            }
            try
            {
                if (emailCorrecto)
                {
                    if (nombre != "" && apellido != "" && nameUser != "" && pass != "" && email != "" && roles.Count() > 0 && estado != "")
                    {
                        Persistencia.Usuario newUser = new Persistencia.Usuario();
                        List<int> idRoles = usrMgr.ObtenerRolesPorNombe(roles);
                        newUser.Nombre = nombre;
                        newUser.Apellido = apellido;
                        newUser.Nombre_Usuario = nameUser;
                        newUser.Contraseña = pass;
                        newUser.Correo = email;
                        newUser.Cantidad_Veces_Loguea = 0;
                        if (estado == "Activo")
                        {
                            newUser.Activo = true;
                        }
                        else 
                        {
                            newUser.Activo = false;
                        }     
                        usrMgr.AgregarUsuario(newUser);
                        usrMgr.AgregarRolesUsuario(newUser.Id, idRoles);
                        TextBox1.Text = "";
                        TextBox2.Text = "";
                        TextBox3.Text = "";
                        TextBox4.Text = "";
                        TextBox5.Text = "";
                        List<string> rolsName = new List<string>();
                        List<Persistencia.Rol> rolesAll = usrMgr.ObtenerRolesActivos();
                        foreach (Persistencia.Rol r in rolesAll)
                        {
                            rolsName.Add(r.Nombre);
                        }
                        ListBox1.DataSource = rolsName;
                        ListBox1.DataBind();
                        List<string> estados = new List<string>();
                        estados.Add("Activo");
                        estados.Add("Inactivo");
                        RadioButtonList2.DataSource = estados;
                        RadioButtonList2.DataBind();
                        mensajeError.Text = "Se ha ingresado correctamente el usuario";
                    }
                    else 
                    {
                        mensajeError.Text = "Debe ingresar todos los campos obligatorios (*)";
                    }
                }
                else
                {
                    mensajeError.Text = "El email ingresado no es correcto";
                }
            }
            catch (Exception)
            {
                mensajeError.Text = "Se ha producido un error al tratar de guardar el usuario.";
            }
        }

        private void CargarDatosDeUsuario(int idusuario)
        {
            UserManager userManager = UserManager.GetInstancia();
            Usuario user = userManager.GetUsuarioById(idusuario);
            TextBox1.Text = user.Nombre;
            TextBox2.Text = user.Apellido;
            TextBox3.Text = user.Nombre_Usuario;
            TextBox4.Text = user.Contraseña;
            TextBox5.Text = user.Correo;
            btnAgregarUsuario.Text += "<form action='MantenimientoUsuarios.aspx' method='post'>";
            btnAgregarUsuario.Text += "<input type='hidden' id='idusuario' name='idusuario' value ='"+idusuario+"' / >";
            btnAgregarUsuario.Text += "<input type='hidden' id='operacion' name='operacion' value = 'ModificarUser'/ >";
            btnAgregarUsuario.Text += "<input type='image' src='Imagenes/btnSave.jpg' onsubmit='submit-form();' title='Modificar usuario'/>";
            btnAgregarUsuario.Text += "</form>";
            if (user.Rol != null)
            {
                foreach (Rol r in user.Rol)
                {
                    int indice = ListBox1.Items.IndexOf(ListBox1.Items.FindByText(r.Nombre));
                    ListBox1.SelectedIndex = indice;
                }
            }
            if (user.Activo == true)
            {
                int indice = RadioButtonList2.Items.IndexOf(RadioButtonList2.Items.FindByText("Activo"));
                RadioButtonList2.SelectedIndex = indice;
            }
            else 
            {
                int indice = RadioButtonList2.Items.IndexOf(RadioButtonList2.Items.FindByText("Inactivo"));
                RadioButtonList2.SelectedIndex = indice;
            }
        }

        private void ModificarUsuario(UserManager usrMgr, int idUsuario)
        {
            string email = TextBox5.Text;
            Utilidades.RegexUtilities userManager = Utilidades.RegexUtilities.GetInstancia();
            bool emailCorrecto = userManager.IsValidEmail(email);
            try
            {
                if (emailCorrecto)
                {
                    Usuario user = usrMgr.GetUsuarioById(idUsuario);
                    user.Nombre = TextBox1.Text;
                    user.Apellido = TextBox2.Text;
                    user.Nombre_Usuario = TextBox3.Text;
                    user.Contraseña = TextBox4.Text;
                    user.Correo = TextBox5.Text;
                    if (RadioButtonList2.SelectedIndex > -1)
                    {
                        if (RadioButtonList2.SelectedItem.Text == "Activo")
                        {
                            user.Activo = true;
                        }
                        else
                        {
                            user.Activo = false;
                        }
                    }
                    List<int> rolesActuales = new List<int>();
                    if (user.Rol != null)
                    {
                        foreach (Rol r in user.Rol)
                        {
                            rolesActuales.Add(r.Id);
                        }
                        usrMgr.QuitarRolesUsuario(user.Id, rolesActuales);
                    }
                    List<string> rolesNuevos = new List<string>();
                    if (ListBox1.SelectedIndex > -1)
                    {
                        foreach (ListItem item in ListBox1.Items)
                        {
                            if (item.Selected)
                            {
                                rolesNuevos.Add(item.Text);
                            }
                        }
                        List<int> idRoles = new List<int>();
                        idRoles = usrMgr.ObtenerRolesPorNombe(rolesNuevos);
                        usrMgr.AgregarRolesUsuario(user.Id, idRoles);
                    }
                    usrMgr.ModificarUsuario(user);
                    TextBox1.Text = "";
                    TextBox2.Text = "";
                    TextBox3.Text = "";
                    TextBox4.Text = "";
                    TextBox5.Text = "";
                    List<string> rolsName = new List<string>();
                    List<Persistencia.Rol> rolesAll = usrMgr.ObtenerRolesActivos();
                    foreach (Persistencia.Rol r in rolesAll)
                    {
                        rolsName.Add(r.Nombre);
                    }
                    ListBox1.DataSource = rolsName;
                    ListBox1.DataBind();
                    List<string> estados = new List<string>();
                    estados.Add("Activo");
                    estados.Add("Inactivo");
                    RadioButtonList2.DataSource = estados;
                    RadioButtonList2.DataBind();
                    mensajeError.Text = "Se ha modificado correctamente el usuario";
            }
            else
            {
                mensajeError.Text = "El email ingresado no es correcto";
            }
        }
        catch (Exception)
        {
            mensajeError.Text = "Se ha producido un error al tratar de guardar lod datos.";
        }
        }
    }
}